<?php

namespace ApiSdk\Kwaixiaodian\Servers;

use Exception;
use GuzzleHttp\Exception\GuzzleException;

class OrderService extends BaseService
{
    /**
     * Notes: 获取订单列表 V2
     * author: lfy
     * Date: 2021/11/19
     * Time: 17:41
     * @throws GuzzleException
     */
    public function getOrderList(array $param = [])
    {
        $orderViewStatus = $param['orderViewStatus'] ?? 1;  //订单状态，0未知 1 全部 2 待付款 3 待发货 4 待收货（已发货）5 已收货 6 交易成功订单 7 已关闭订单
        $pageSize        = $param['pageSize'] ?? 50;        //每页请求数量 最多一页50条
        $sort            = $param['sort'] ?? 1;             //1时间降序 2时间升序 默认降序
        $queryType       = $param['queryType'] ?? 1;        //1按创建时间查找 2按更新时间查找 默认创建时间
        $beginTime       = $param['beginTime'] ?? 0;        //订单生成时间的开始时间，单位毫秒， 不能小于90天前，且需要小于结束时间
        $endTime         = $param['endTime'] ?? 0;          //订单生成时间的截止时间，单位毫秒，与开始时间的时间范围不大于7天
        $cpsType         = $param['cpsType'] ?? 0;          //分销类型 0-全部 1-普通订单 2-分销订单
        $cursor          = $param['cursor'] ?? '';          //游标内容 第一次传空串，之后传上一次的cursor返回值，若返回“nomore”则标识到底
        if (!empty($orderViewStatus)) $this->addApiParam('orderViewStatus', $orderViewStatus);
        if (!empty($pageSize)) $this->addApiParam('pageSize', $pageSize);
        if (!empty($sort)) $this->addApiParam('sort', $sort);
        if (!empty($queryType)) $this->addApiParam('queryType', $queryType);
        if (!empty($beginTime)) $this->addApiParam('beginTime', $beginTime);
        if (!empty($endTime)) $this->addApiParam('endTime', $endTime);
        if (!empty($cpsType)) $this->addApiParam('cpsType', $cpsType);
        $this->addApiParam('cursor', $cursor);
        return $this->get('open.order.cursor.list');
    }

    /**
     * Notes: 订单详情v2
     * author: lfy
     * Date: 2021/11/19
     * Time: 17:48
     * @param $order
     * @return array|bool|void
     * @throws GuzzleException
     */
    public function getOrderDetail($order)
    {
        $this->addApiParam('oid', $order);
        return $this->get('open.order.detail');
    }

    /**
     * Notes: 订单发货，当前不支持拆单多次发货
     * author: lfy
     * Date: 2021/11/19
     * Time: 18:02
     * @param $orderId //订单编号
     * @param $expressNo //快递单号
     * @param $expressCode //快递公司code，由https://open.kwaixiaodian.com/docs/dev?id=VRk7NdU6ZI获取
     * @param string $qualityParam //质检信息专用非必填，发货可忽略
     * @param string $returnAddressId //商家退货地址，可从查询商家地址列表API-open.address.seller.list中获取退货地址
     * @return array|bool|void
     * @throws GuzzleException
     */
    public function orderShipment($orderId, $expressNo, $expressCode, string $qualityParam = '', string $returnAddressId = '')
    {
        $this->addApiParam('orderId', $orderId);
        $this->addApiParam('expressNo', $expressNo);
        $this->addApiParam('expressCode', $expressCode);
        if (!empty($qualityParam)) $this->addApiParam('qualityParam', $qualityParam);
        if (!empty($returnAddressId)) $this->addApiParam('returnAddressId', $returnAddressId);
        return $this->post('open.seller.order.goods.deliver');
    }

    /**
     * Notes: 获取订单列表(游标方式)
     * author: lfy
     * Date: 2021/11/19
     * Time: 18:29
     *  参数名             类型      必须      详情描述
     *  type            Integer     是       订单状态，0未知 1 全部 2 待付款 3 待发货 4 待收货（已发货）5 已收货 6 交易成功订单 7 已关闭订单
     *  currentPage     Long        是       当前页
     *  pageSize        Integer     是       每页请求数量 最多一页100条
     *  sort            Integer     否       1时间降序 2时间升序 默认降序
     *  queryType       Integer     否       1按创建时间查找 2按更新时间查找 默认创建时间
     *  beginTime       Long        是       订单生成时间的开始时间，单位毫秒， 不能小于90天前，且需要小于结束时间
     *  endTime         Long        是       订单生成时间的截止时间，单位毫秒， 不能小于90天前，且与开始时间的时间范围不大于1天 (与开始时间的时间范围建议做成随时可配置，该范围可能在活动期间随时变化，比如变成小时级或者分钟级)。受春节活动影响，在2.1 10:00~2.5 10:00以及2.10 10:00~2.19 10:00期间订单的查询时间范围从1天缩短至1小时。
     *  cpsType         Integer     否       分销类型 0-全部 1-普通订单 2-分销订单
     *  pcursor         String      是       游标内容 第一次传空串，之后传上一次的pcursor返回值，若返回“nomore”则标识到底
     * @param $param
     * @return array|bool|void
     * @throws GuzzleException
     */
    public function getOrderPCursorList($param)
    {
        $this->setApiParams($param);
        return $this->get('open.seller.order.pcursor.list');
    }

    /**
     * Notes:   获取分销订单列表(游标方式)
     * author: lfy
     * Date: 2021/11/19
     * Time: 18:33
     *      参数名              类型         必须        详情描述
     *      currentPage         Long        是           当前页
     *      pageSize            Integer     是           每页请求数量 最多一页80条
     *      sort                Integer     否           1时间降序 2时间升序 默认降序
     *      queryType           Integer     否           1按创建时间查找 2按更新时间查找 默认创建时间
     *      type                Integer     否           订单状态，0未知 1 全部 2已付款 3 已收货 4 已结算5 已失效
     *      pcursor             String      是           游标内容，第一次传空串，之后传上一次的pcursor返回值，若返回“nomore”则标识到底
     *      distributorId       Long        是           分销者id
     *      beginTime           Long        是           订单生成时间的开始时间，单位毫秒，不能小于90天前，且需要小于结束时间
     *      endTime             Long        是           订单生成时间的截止时间，单位毫秒，不能小于90天前，且与开始时间的时间范围不大于1天 (与开始时间的时间范围建议做成随时可配置，该范围可能在活动期间随时变化，比如变成小时级或者分钟级)
     * @param $param
     * @return array|bool|void
     * @throws GuzzleException
     */
    public function getOrderCpsList($param)
    {
        $this->setApiParams($param);
        return $this->get('open.seller.order.cps.list');
    }

    /**
     * Notes: 获取分销订单详情
     * author: lfy
     * Date: 2021/11/20
     * Time: 9:26
     * @param int $distributorId 分销者ID
     * @param int $orderId 订单ID
     * @return array|bool|void
     * @throws GuzzleException
     */
    public function getOrderCpsDetail(int $distributorId, int $orderId)
    {
        $this->addApiParam('distributorId', $distributorId);
        $this->addApiParam('orderId', $orderId);
        return $this->get('open.seller.order.cps.detail');
    }

    /**
     * Notes: 添加备注，尚未开放清除插旗功能
     * author: lfy
     * Date: 2021/11/20
     * Time: 9:31
     * @param int $orderId
     * @param array $param
     *      $param参数名       类型          必须        详情描述
     *      staffId             Number      否           员工ID
     *      note                String      否           备注 字符数<=200
     *      flag                Integer     否           0：表示不插旗; 1：RED; 2：YELLOW; 3：GREEN; 4：BLUE; 5：PURPLE; 6：GREY;
     * @return array|bool|void
     * @throws GuzzleException
     */
    public function sellerOrderNoteAdd(int $orderId, array $param = [])
    {
        $this->addApiParam('orderId', $orderId);
        $this->setApiParams($param);
        return $this->post('open.seller.order.note.add');
    }

    /**
     * Notes: 物流更新
     * author: lfy
     * Date: 2021/11/20
     * Time: 9:36
     * @param int $orderId 订单编号
     * @param string $expressNo 快递单号
     * @param int $expressCode 快递公司code
     * @return array|bool|void
     * @throws GuzzleException
     */
    public function sellerOrderLogisticsUpdate(int $orderId, string $expressNo, int $expressCode)
    {
        $this->addApiParam('orderId', $orderId);
        $this->addApiParam('expressNo', $expressNo);
        $this->addApiParam('expressCode', $expressCode);
        return $this->post('open.seller.order.logistics.update');
    }

    /**
     * Notes: 获取订单费用详情
     * author: lfy
     * Date: 2021/11/20
     * Time: 9:40
     * @param int $orderId
     * @return array|bool|void
     * @throws GuzzleException
     */
    public function getOrderFeeDetail(int $orderId)
    {
        $this->addApiParam('orderId', $orderId);
        return $this->get('open.seller.order.fee.detail');
    }

    /**
     * Notes: 关闭订单，待付款订单可关闭
     * author: lfy
     * Date: 2021/11/20
     * Time: 9:40
     * @param int $orderId
     * @return array|bool|void
     * @throws GuzzleException
     */
    public function sellerOrderClose(int $orderId)
    {
        $this->addApiParam('orderId', $orderId);
        return $this->post('open.seller.order.close');
    }

    /**
     * Notes: 修改订单规格
     * author: lfy
     * Date: 2021/11/20
     * Time: 9:45
     * @param int $orderId
     * @param int $itemId 商品id
     * @param string $oldSkuId 订单商品老skuID
     * @param string $newSkuId 订单商品新skuID
     * @return array|bool|void
     * @throws GuzzleException
     */
    public function sellerOrderSkuUpdate(int $orderId, int $itemId, string $oldSkuId, string $newSkuId)
    {
        $this->addApiParam('orderId', $orderId);
        $this->addApiParam('itemId', $itemId);
        $this->addApiParam('oldSkuId', $oldSkuId);
        $this->addApiParam('newSkuId', $newSkuId);
        return $this->post('open.seller.order.sku.update');
    }


}
